package net.ufrog.common;

/**
 * 调用信息
 * 
 * @author ultrafrog
 * @version 1.0, 2012-11-29
 * @since 1.0
 */
public class Caller {

    /** 类型名称 */
    private String className;

    /** 方法名称 */
    private String methodName;

    /** 行数 */
    private Integer lineNumber;

    /**
     * 构造函数
     *
     * @param className 类型名称
     * @param methodName 方法名称
     * @param lineNumber 行数
     */
    public Caller(String className, String methodName, Integer lineNumber) {
        this.className = className;
        this.methodName = methodName;
        this.lineNumber = lineNumber;
    }

    /**
     * 读取类型名称
     *
     * @return 类型名称
     * @see #className
     */
    public String getClassName() {
        return className;
    }

    /**
     * 设置类型名称
     *
     * @param className 类型名称
     * @see #className
     */
    public void setClassName(String className) {
        this.className = className;
    }

    /**
     * 读取方法名称
     *
     * @return 方法名称
     * @see #methodName
     */
    public String getMethodName() {
        return methodName;
    }

    /**
     * 设置方法名称
     *
     * @param methodName 方法名称
     * @see #methodName
     */
    public void setMethodName(String methodName) {
        this.methodName = methodName;
    }

    /**
     * 读取行数
     *
     * @return 行数
     * @see #lineNumber
     */
    public Integer getLineNumber() {
        return lineNumber;
    }

    /**
     * 设置行数
     *
     * @param lineNumber 行数
     * @see #lineNumber
     */
    public void setLineNumber(Integer lineNumber) {
        this.lineNumber = lineNumber;
    }

    /**
     * 获取调用信息
     *
     * @return 调用信息
     */
    public static Caller caller(int level) {
        StackTraceElement[] elements = Thread.currentThread().getStackTrace();
        StackTraceElement caller = elements[level];
        return new Caller(caller.getClassName(), caller.getMethodName(), caller.getLineNumber());
    }
}